#include <iostream>
using namespace std;

class Point
{
public:
    // 使用带参数默认构造函数，并使用初始化列表初始化 x，y
    Point(double x = 0, double y = 0) : x(x), y(y) {
        cout << "Point(double x = " << x << ", double y = " << y << ")" << endl;
    }
    // 析构函数，由于没有申请内存，析构函数中不需要做什么
    ~Point() {
        cout << "~Point():(" << x << ", " << y << ")" << endl;
    }
    // x, y 绑定的成成员函数
    void setX(double x) { this->x = x; }
    double getX() { 
        cout << "double getX()" << endl;
        return x; 
    }
    double getX() const { 
        cout << "double getX() const" << endl;
        return x; 
    }
    void setY(double y) { this->y = y; }
    double getY() const { return y; }
private:
    double x;
    double y;
};

class Line
{
public:
    Line(double aX, double aY, double bX, double bY)
        : pointA(aX, aY)
        , pointB(bX, bY) {
        // error
        // pointA.setX(aX);
        // pointA.setY(aY);
        // pointB.setX(bX);
        // pointB.setY(bY);
        // cout << "Line(double aX, double aY, double bX, double bY)" << endl;
        // cout << "a:x = " << pointA.getX() << ", b:x = " << pointB.getX() << endl;
    }
    ~Line() {
        cout << "~Line()" << endl;
    }
    Point getPointA() { return pointA; }
    Point getPointB() { return pointB; }
private:
    /**
     * const 放在数据类型前面和后面，其作用相同
     * 但是写法都是合法的
     * 
     * const 数据成员只能通过初始化列表的方式进行初始化
    */
    const Point pointA;
    Point pointB;
};
#include <iostream>
using namespace std;

/**
 * 1. 使用引用传递参数，减少创建临时对象，可以降低消耗
 * 2. 使用 const 修饰对象防止函数中对传递的对象进行修改
 * 3. 基本数据类型可以不适用引用或指针传递，因为基本数据类型创建临时对象成本可以忽略
*/
void doSomething(const Point &p)
{
    cout << p.getX() << ", " << p.getY() << endl;
}

int main()
{
    Point point(1, 2);
    // 常引用
    const Point &point2 = point;
    // 常指针
    const Point *p = &point;
    point2.getX();
    p->getX();
    // error：常引用与常指针只能访问常成员函数
    // point2.setX(4);
    // p->setY(9);
    return 0;
}